<?php 
/* --------------------------------
 * /adm/DBConnector/mysql.php
 * Класс работы с mysql базой v2
 * 
 * 28 май 2012
 * © Deemon
 --------------------------------*/
class DBConnector
{
	private $conn=false;//Соединение
	private $db=false;//База
	private $result=array(false);//Результат

	private $dbHost;//адрес mysql сервера
	private $dbUser;//Имя пользователя
	private $dbPass;//Пароль
	private $dbName;//Название базы
	
	public $charset='utf8';
	public $echoQ=false;//Вывести запрос
	public $elog=false;//Ссылка на объект вывода лога
	
	public $is_unbuffered = false;
	
	public $errors=array();//список ошибок
	
	public function DBConnector( $user, $pass, $db, $host='localhost' )
    {
		$this->dbHost=$host;
		$this->dbUser=$user;
		$this->dbPass=$pass;	
		$this->dbName=$db ;
    } 
//Лог ошибок
	private function addLog( $err, $type )
	{
		if($this->elog)
			$this->elog->add("mysql :: $err",$type,array('class'=>'mysql'));
	}
//Подключение к серверу
	public function Connect()
	{
		//Пробую подключиться
		$conn=mysql_connect($this->dbHost,$this->dbUser,$this->dbPass);
		if(!$conn)
		{
			$this->addLog('Соединение с mysql-серверром неудалось','error');
			$this->conn = false;
			return false;
		}
		else
			$this->conn=$conn;
		return true;
	}
//Указать базу
	public function SelectDB($name=false)
	{
		if(!$name)$name=$this->dbName;
		$this->erro=false;//Очищаю ошибку 
		if($this->conn)
		{
			$db=mysql_select_db($name,$this->conn);
			if(!$db)
			{
				$this->addLog('Соединение с базой не удалось - возможно такой базы не существует','error');
				return false;
			}
			else
			{
				//Явно объявляю кодировки
				mysql_query("SET NAMES '{$this->charset}'");
				mysql_query("SET CHARACTER SET '{$this->charset}'");
				$this->db=$db;
			}
		}
		else
		{
			$this->addLog('Не могу подключиться к базе - нет соединения','error');
			return false;
		}
		return true;
	}
	
	public function unquery( $sql, $ind = 0)
	{
		if( $this->echoQ && $this->elog ) {
			// $this->addLog(str_replace(' ','&nbsp;',htmlspecialchars($sql)),'notice');
		}

		$this->erro=false;//Очищаю ошибку 
		$this->rowCnt[$ind]=false;//Очищаю количество строк 
		if(!$this->conn)//Если нет подключения, подключаю
		{
			if($this->Connect())
			{
				if(!$this->SelectDB())
				return false;
			}
			else
			{
				$this->addLog('Отсутствует соединение','notice');
				return false;
			}
		}
		
		$result=mysql_unbuffered_query($sql,$this->conn);
		$this->is_unbuffered = true;
		if( !$result )
		{
			$this->result[$ind] = false;
			$this->addLog( 'Ошибка запроса :'. htmlspecialchars(mysql_error($this->conn))." <br>\r\n \"$sql\"",'error');
			return false;
		}
		else
		{
			$this->result[$ind]=$result;	
			$this->rowCnt[$ind] = 1;
		}
		return true;
	}
//Выполнить запрос, если нужно получить id добавленного элемента
	public function query( $sql, $getId = false, $ind = 0, &$resource=false)
	{
		if( $this->echoQ && $this->elog ) {
			$this->addLog(str_replace(' ','&nbsp;',htmlspecialchars($sql)),'notice');
		}
				
		$this->erro=false;//Очищаю ошибку 
		$this->rowCnt[$ind]=false;//Очищаю количество строк 
		if(!$this->conn)//Если нет подключения, подключаю
		{
			if($this->Connect())
			{
				if(!$this->SelectDB())
				return false;
			}
			else
			{
				$this->addLog('Отсутствует соединение','notice');
				return false;
			}
		}
		
		$result=mysql_query($sql,$this->conn);
		$resource=$result;
		
		if(!$result)
		{
			$this->result[$ind]=false;
			$this->errors[] = mysql_error($this->conn);
			$this->addLog( 'Ошибка запроса :'. htmlspecialchars(mysql_error($this->conn))." <br>\r\n \"$sql\"",'error');
			return false;
		}
		else
		{
			$this->result[$ind]=$result;			
			if($getId)
				return mysql_insert_id($this->conn);			
			elseif(!is_bool($this->result[$ind]))
				$this->rowCnt[$ind]=mysql_num_rows($result);
		}		
		return true;
	}
//Количество строк выдачи
	public function rowCount($ind=0)
	{
		return  $this->rowCnt[$ind];
	}
//Количество строк модификации
	public function affected( $ind = 0 )
	{
		return  mysql_affected_rows($this->result[$ind]);
	}
//Следующая строка выдачи
	public function fetch($ind=0,$arr_type=false)
	{
		$this->erro=false;//Очищаю ошибку 
		if($this->conn)
		{
			if(!$this->result[$ind])
			{
				$this->addLog('Нет выдачи - возможно ошибка запроса','notice');//Ошибка выдачи
				return false;
			}
			else
			{
				if($this->rowCnt[$ind]>0)
				{
					
					return $arr_type
						?mysql_fetch_array($this->result[$ind],$arr_type)
						:mysql_fetch_object($this->result[$ind]);
				}
				else 
				{
					$this->addLog('Запрос выдал пустой результат','notice');//Пустая выдача
					return false;
				}
			}
		}
		else
		{
			$this->addLog('Отсутствует соединение','notice');
			return false;
		}
		return false;
	}
//Закрыть соединение с базой
//	public function close($err=true)
//	{
//		if($this->conn && !$this->is_unbuffered)
//		{
//			if(mysql_close($this->conn))
//				return true;
//			else
//				$this->addLog('Ошибка разъединения - возможно соединение уже разорвано','notice');//Не удалось разъединиться
//		}
//		elseif($err)
//			$this->addLog('Отсутствует соединение','notice');
//		return false;
//	}
//Деструктор 
	public function __destruct()
    {

	    if($this->conn !== false) mysql_close($this->conn);



	    unset($this);

    }
}